// 集中管理购物车模块相关数据并持久化
import { defineStore } from "pinia";
import {ref,computed} from 'vue'
import { useUserStore } from "./userStore";
import { insertCart,findNewCartList,DelCart} from "@/apis/cart";
export const useCartStore=defineStore('cart',()=>{
  const userStore=useUserStore()
  // 定义登录状态变量
  const isLogin=userStore.userInfo.token
  // 1.定义管理购物车数据的state
  const cartList=ref([])
  // 定义获取最新购物车列表的函数以免重复写多的代码
  const updateNewList=async()=>{
      const res=await findNewCartList()
      cartList.value=res.result
  }
  // 2.定义获取接口数据的action加入购物车
  const addCart=async(goods)=>{
    const {skuId,count}=goods
    // 登录判断
    if(isLogin){
      // 登录之后的加入购物车逻辑
      await insertCart({skuId,count})
      // 登录之后的获取最新购物车列表逻辑
      // const res=await findNewCartList()
      // console.log(res.result);
      // 用最新的购物车列表覆盖本地购物车列表
      // cartList.value=res.result
      updateNewList()
      
    }else{
      // 非登录本地的加入购物车逻辑
      // 添加购物车
      // 添加过则count+1
      // 没有添加则直接push
      // 通过匹配传递过来的商品对象中的skuId看能不能在carList中找到，找到就是  添加过
    const item=cartList.value.find((item)=>goods.skuId===item.skuId)
    if(item){
      // 找到了说明为同类商品则该商品数量+1
      item.count++
    }else{
      // 没找到则追加到购物车列表
      cartList.value.push(goods)
    }
    }
  }

  // 删除购物车
  const delCart=async(skuId)=>{
    if(isLogin){
      await DelCart([skuId])
      // 登录后并且删除了之后的获取最新购物车列表逻辑
      // const res=await findNewCartList()
      // console.log(res.result);
      // 用最新的购物车列表覆盖本地购物车列表
      // cartList.value=res.result
      updateNewList()
    }else{
      // 方法1----splice
      // const index=cartList.value.findIndex((item)=>skuId===item.skuId)
      // cartList.value.splice(index,1)

      // 方法2----filter
      cartList.value=cartList.value.filter((item)=>skuId!==item.skuId)
  
    }
    
    
  }

  // 清除购物车
  const clearCart=()=>{
    cartList.value=[]

  } 
  

  // 计算属性
  // 1.购物车总的数量
  const allCount=computed(()=>cartList.value.reduce((a,item)=>a+item.count,0))
  
  // 2.购物车总的价格,并保留两位小数
  const allPrice=computed(()=>cartList.  value.reduce((a,item)=>a+(item.count*item.price),0).toFixed(2))

  // 3.购物车选中时总的数量
  const selectedCount=computed(()=>cartList.value.filter((item)=>item.selected===true).reduce((a,item)=>a+item.count,0))

  // 4.购物车选中时总的价格,并保留两位小数
  const selectedPrice=computed(()=>cartList.value.filter((item)=>item.selected===true).reduce((a,item)=>a+(item.count*item.price),0).toFixed(2))

  // 购物车单选功能
  const singleCheck=(skuId,selected)=>{
    // 通过skuId找到要修改的那一项，然后把该项中的selected修改为我们传过来的selected
    const item=cartList.value.find((item)=>skuId===item.skuId)
    item.selected=selected

  }

  // 是否全选---使用every函数，如果满足条件则返回true，否则为false
  const isAll=computed(()=>cartList.value.every((item)=>item.selected===true))

  // 购物车全选功能
  const allCheck=(selected)=>{
    // 把cartList中每一项的selected值都设置为当前全选框传过来的selected状态
    cartList.value.forEach((item)=>item.selected=selected)


  }

  return {
    cartList,
    allCount,
    allPrice,
    isAll,
    selectedCount,
    selectedPrice,
    addCart,
    delCart,
    singleCheck,
    allCheck,
    clearCart,
    updateNewList
    

  }
},
{
  persist:true
}
)